前言
在rabbitmq中,支持多种Exchange转发模式,包括Direct-Exchange,Fanout-Exchange,Topic-Exchange,Headers-Exchange四种转发模式。下面将一一介绍这四种转发模式的特点及区别。
Direct-Exchange
转发规则:完全匹配路由键routkey,只有当消息发送的routkey完全匹配queue绑定的key时,exchange才转发消息到该队列。
Fanout-Exchange
转发规则:不处理路由键routkey,只需要简单的将队列绑定到交换机上。发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。
Topic-Exchange
转发规则:模糊匹配路由键routkey,模糊匹配成功则exchange转发消息到匹配成功的队列。
“*”:表示一个关键字;
“#”:表示0个或若干个关键字;
其中routkey是由多个关键字以点号分隔,构成的字符串(最大255字节)。
例如:quick.orange.rabbit;quick.orange.*;quick.orange.#;
quick.orange.*:可以匹配quick.orange.log;quick.orange.any;…等等
quick.orange.#:可以匹配quick.orange;quick.orange.log;quick.orange.log.error;…等等
Headers-Exchange
Message 1 is delivered to Queue A - by default x-match=all;
Message 2 is delivered to Queue A and Queue B - the queue is configured to match any;
Message 3 is not delivered to any queue - the queue is configured to match all;
转发规则:使用消息头代替 routing key 作为关键字进行路由。根据消息头中的多个属性值进行路由转发,而忽略路由键routkey属性,如果消息头中属性的值等于设置bind时指定的值,则认为匹配成功,Headers-Exchange将消息转发到此队列中。其中路由属性值不必是字符串,可以是例如整数或散列(字典)等。
通过修改消息头中的参数”x-match”值来调整匹配规则,默认是all:
x-match=any: 消息头中多个属性中的一个值与bind设置的相等则匹配成功;
x-match=all: 消息头中多个属性中的所有值与bind设置的相等则匹配成功;
总结
如果在exchange中进行消息转发时,无法匹配到queue,则丢弃该消息。
参考链接
- https://www.rabbitmq.com/tutorials/amqp-concepts.html
- https://www.cloudamqp.com/blog/2015-09-03-part4-rabbitmq-for-beginners-exchanges-routing-keys-bindings.html
- http://previous.rabbitmq.com/v3_4_x/tutorials/tutorial-four-java.html
- http://previous.rabbitmq.com/v3_4_x/tutorials/tutorial-five-java.html